/*
 * Copyright 2008 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package net.thick4.convention;

import org.springframework.util.StringUtils;

/**
 * フレームワークに関連する規約を決定するためのインターフェースの
 * 共通メソッドをまとめた抽象クラスです。
 */
public class TempConvention implements Convention {

	/**
	 * 基準パッケージです。
	 */
	private String[] basePackages;
	
	/**
	 * クラス名で指定したクラスが基準パッケージ以下に
	 * 含まれるかどうかを判定して返します。
	 * @return className クラス名
	 * @return 含まれる場合は true を返し、それ以外は false を返します。
	 */
	public boolean includeBasePackage(String className) {
		return includePacakge(getBasePackages(), className);
	}
		
	/**
	 * URLを決定するための基準パッケージを返します。
	 * @return basePackage 基準パッケージ
	 */
	public String[] getBasePackages() {
		return this.basePackages;
	}
	
	/**
	 * URLを決定するための基準パッケージを指定します。
	 * @param basePackages 基準パッケージ
	 */
	public void setBasePackages(String basePackages) {
		this.basePackages = StringUtils.commaDelimitedListToStringArray(basePackages);
	}
	
	/**
	 * URLを決定するための基準パッケージを指定します。
	 * @param basePackage 基準パッケージ
	 */
	public void setBasePackages(String[] basePackages) {
		this.basePackages = basePackages;
	}
	
	/**
	 * 指定されたクラス名がパッケージに含まれているかどうかを判定します。
	 * @param packages パッケージ
	 * @param className 判定するクラス名
	 * @return 再読み込み可能パッケージに含まれる場合は true を返します。
	 */
	protected boolean includePacakge(String[] packages, String className) {
		for (int i=0; i<packages.length; ++i) {
			String packageName = packages[i];
			if (packageName.endsWith(".") == false) {
				packageName = packageName + ".";
			}
			if (className.startsWith(packageName)) {
				return true;
			}
		}
		return false;
	}
	
}

